/**
 * 上传文件接受接口
 */

//引入Q模块
var Q = require('q');
//引入通用函数模块
var util = require('../../util');
//引入fs模块操作文件
var fs = require('fs');
//引入path模块解析路径
var path = require('path');

//upload入口函数
var index = function(getData, postData, config, _redis, db) {
	var deferred = Q.defer();
	//判断是否存在店铺的文件夹
	if(!fs.existsSync(config.uploadPath + '/' + postData.storeId)) {
		//不存在
		deferred.reject('-0020');
	}
	//获取传上的name值
	var name = Object.keys(postData.files)[0];
	//获取有关文件的信息
	file = postData.files[name][0];
	//根据文件的MIME类型判别是否属于可上传的文件类型
	checkFileType(file.headers['content-type'], config.uploadAllowType).then(function() {
		//获取到包括后缀的文件名
		var fileName = postData.fields.fileName || path.basename(file.path);
		//将fileName嵌入字段中方便触发的接口使用
		postData.fields.fileName = fileName;
		//判断是否存在处理的触发接口参数
		util.isSet(postData.fields.handleInterface).then(function() {
			console.log(postData.fields);
			//将数据从URI编码转换回原数据格式
			for(var fieldName in postData.fields) {
				postData.fields[fieldName] = decodeURI(postData.fields[fieldName]);
			}
			//触发对应的处理接口
			util.triggerInterface(postData.fields.handleInterface, getData, postData.fields, config, _redis, db).then(function(data) {
				//是否存在返回数据，否则为1
				data = data || 1;
				//放置文件的新路径
				var newPath = config.uploadPath + '/' + postData.storeId + '/' + name;
				console.log(newPath);
				saveFile(file.path, newPath, fileName).then(function() {
					//返回触发接口后得到的数据
					deferred.resolve(data);
				}, function() {
					//将上传的文件从临时文件夹转移到保存路径时失败
					deferred.reject('-0077');
				});
			}, function(errCode) {
				//调用接口错误返回错误码
				deferred.reject(errCode);
			});
		}, function() {
			var newPath = config.uploadPath + '/' + postData.storeId + '/' + name;
			console.log(newPath);
			saveFile(file.path, newPath, fileName).then(function() {
				//返回1
				deferred.resolve(1);
			}, function() {
				//将上传的文件从临时文件夹转移到保存路径时失败
				deferred.reject('-0077');
			});
		});
	}, function() {
		//不是允许上传的文件类型
		deferred.reject('-0021');
	});
	return deferred.promise;
}

//检查文件MIME类型是否合法
var checkFileType = function(contentType, uploadAllowType) {
	var deferred = Q.defer();
	console.log(contentType);
	//遍历允许上传的MIME类型类别
	for(var index in uploadAllowType) {
		if(contentType == uploadAllowType[index]) {
			//允许的类型
			deferred.resolve();
			break;
		}
	}
	//不允许的类型
	deferred.reject();
	return deferred.promise;
}

var saveFile = function(tempPath, newPath, fileName) {
	var deferred = Q.defer();
	try {
		if(!fs.existsSync(newPath)) {
			//不存在则新建一个名为name参数的文件夹
			fs.mkdirSync(newPath);
		}
		//为新路径追加带后缀的文件名
		newPath = newPath + '/' + fileName;
		//移动旧路径的该文件到新的路径中
		fs.renameSync(tempPath, newPath);
		deferred.resolve();
	}
	catch(e) {
		deferred.reject();
	}
	return deferred.promise;
}

//暴露接口
module.exports = {
	index: index
}